/**
 * @title 合约部署脚本
 * @description 用于部署SimpleERC20和SimpleNFT合约到区块链网络
 */
async function main() {
  /**
   * 获取部署账户
   * ethers.getSigners() 返回Hardhat环境中的账户列表
   * 解构赋值获取第一个账户作为部署者
   */
  const [deployer] = await ethers.getSigners();

  // 打印部署账户信息
  console.log("部署合约使用的账户:", deployer.address);
  console.log("账户余额:", (await deployer.getBalance()).toString());

  /**
   * 获取合约工厂
   * ethers.getContractFactory() 创建一个合约工厂实例
   * 用于部署新的合约实例或连接到已部署的合约
   */
  const SimpleERC20 = await ethers.getContractFactory("SimpleERC20");
  const SimpleNFT = await ethers.getContractFactory("SimpleNFT");
  
  console.log("部署合约中...");
  
  // 部署ERC20合约，初始供应量为1000000
  /**
   * deploy() 方法部署新合约
   * 参数1000000 是初始供应量（不包含精度，合约内部会自动计算精度）
   * 返回一个Promise，解析为合约实例
   */
  const erc20Token = await SimpleERC20.deploy(1000000);
  
  /**
   * deployed() 等待合约部署交易被确认
   * 在区块链上确认交易后才继续执行后续代码
   */
  await erc20Token.deployed();
  console.log(`ERC20代币已部署到: ${erc20Token.address}`);
  
  // 部署NFT合约
  /**
   * deploy() 方法部署NFT合约
   * 参数1: NFT集合名称
   * 参数2: NFT集合符号
   * 参数3: NFT元数据基础URI
   */
  const nftContract = await SimpleNFT.deploy("MyNFT", "MNFT", "https://example.com/nfts/");
  await nftContract.deployed();
  console.log(`NFT合约已部署到: ${nftContract.address}`);
}

// 执行主函数
main()
  .then(() => process.exit(0)) // 成功时退出进程，状态码为0
  .catch((error) => { // 捕获错误并打印
    console.error(error);
    process.exit(1); // 出错时退出进程，状态码为1
  });